ホームに戻る
出典 :
Grid クラス (System.Windows.Controls) | Microsoft Docs Panel クラス (System.Windows.Controls) | Microsoft Learn C#WPFの道#3!Gridの使い方をわかりやすく解説!|ピーコックアンダーソン WPF/XAML : TabControl 中の TabItem の高さを自動で揃える - i++ 方法: グリッド間でサイズ設定プロパティを共有する - WPF .NET Framework | Microsoft Learn
関連 :
目次 :

Grid コントロール( System.Windows.Controls.Grid )

コントロールを配置するための下地となる Panel の一種で、行と列からなる格子領域を規定する。 DataGrid との混同に注意。 画像

具体例

下図のような3行3列の配置を考える。
配置例
XAML
<Window> : <!-- Grid 領域 --> <Grid> <!-- 行の定義 --> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- 列の定義 --> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <!-- コントロールの配置 --> <!-- ① : Label --> <Label Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2"/> <!-- ② : Image --> <Image Grid.Column="0" Grid.Row="1" Grid.RowSpan="2"/> <!-- ③ : Image --> <Image Grid.Column="1" Grid.Row="1" Grid.RowSpan="2"/> <!-- ④ : Canvas --> <Canvas Grid.Column="2" Grid.Row="0" Grid.RowSpan="2"/> <!-- ⑤ : Button --> <Button Grid.Column="2" Grid.Row="2"/> </Grid> : </Window>
解説

"*" を用いる際の注意点

高さまたは幅を "*" で指定した場合、Grid(または親要素)のサイズが確定していなければ正常に動作しない。

Grid 要素間のサイズ共有

異なる Grid 同士の列の幅、または行の高さを共有することができる。
用途の一つとして、TabItem の高さを揃えることが挙げられる。
配置例
TabItem (およびその親となる TabControl )は、内容に合わせて高さが自動的に調整される。このため、通常はタブを選択するごとに TabControl や Window 全体の高さが変わってしまう。
これは Grid を用いて高さを共通化させることで抑制することができる。
ウィンドウ(XAML)
<Window x:Class="WFPFunctionTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WFPFunctionTest" mc:Ignorable="d" Title="TabControl" SizeToContent="WidthAndHeight"> <StackPanel> <!-- Grid.IsSharedSizeScope を True に設定 --> <TabControl Grid.IsSharedSizeScope="True"> <!-- タブ"Item 1" --> <TabItem Header="Item 1"> <!-- Grid を配置 --> <Grid> <Grid.RowDefinitions> <!-- SharedSizeGroup に任意の文字列を設定 --> <!-- 行の高さの共有に用いる --> <RowDefinition SharedSizeGroup="TabControlGroup"/> </Grid.RowDefinitions> <StackPanel Height="200"> <!-- ここにコンテンツを配置 --> </StackPanel> </Grid> </TabItem> <!-- タブ"Item 2" --> <TabItem Header="Item 2"> <!-- タブ"Item 1"と同様に記述する --> <Grid> <Grid.RowDefinitions> <!-- SharedSizeGroup を"Item 1"と揃える --> <RowDefinition SharedSizeGroup="TabControlGroup"/> </Grid.RowDefinitions> <StackPanel Height="100"> <!-- ここにコンテンツを配置 --> </StackPanel> </Grid> </TabItem> </TabControl> </StackPanel> </Window>
2つのタブを有する TabControl を例に挙げる。
TabItem の高さはコンテンツによって決まるため、通常"Item 1"は200pixel、"Item 2"は100pixelとなる。
しかしそれぞれの TabItem 内に Grid を配置し、RowDefinition の SharedSizeGroup を設定することで、Grid の行の高さ = TabItem の高さが共有される。
要点は以下である。 但し、TabItem の高さがタブを開いた際に計算されることに変わりは無く、低いタブ⇒高いタブの順に開いた場合は TabControl の高さが伸びる。
高いタブを先に開いた場合は縮むことは無い。

コントロールの重ね描き

複数のコントロールで Grid.Column 、Grid.Row が重複する場合、それらは重ねて描画される。 このとき Panel.ZIndex の値が大きいものがより手前に表示される。リンク先も併せて参照のこと。